/**
 * Created by way on 2015/1/14.
 */
var gulp = require('gulp');
var _ = require('lodash');

//用于gulp传递参数
var minimist = require('minimist');
var path = require('path');
var webpack = require('webpack');
// var webpack = require('webpack-stream'); 在 windows 中报错，改用原生方案！
// var logger = require('gulp-logger');
var gutil = require('gulp-util');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var less = require('gulp-less');
var mincss = require('gulp-clean-css');
var autoprefixer = require('gulp-autoprefixer');
var header = require('gulp-header');
var tap = require('gulp-tap');
var pkg = require('./package.json');
var named = require('vinyl-named');
var gulpif = require('gulp-if');
var htmlmin = require('gulp-htmlmin');
var markdown = require('gulp-markdown');
var connect = require('gulp-connect');
var watch = require('gulp-watch');
// var browserSync = require('browser-sync').create(); // 自动刷新页面

var src = './src/ogs/'; 
var dest = 'dist/ogs/'; 

var opts = {
  string: 'env',
  default: { env: process.env.NODE_ENV || 'production' }
};

var options = minimist(process.argv.slice(2), opts);
var wpDevCfg = require('./webpack.config.js');
var wpProdCfg = require('./webpack.config.js');

// js 打包日志
function packLog(err, msg) {
  if (err)
    throw new gutil.PluginError("buildjs", err);
  gutil.log("[buildjs]", msg.toString({ colors: true }));
}

// 去掉页面空格，拷贝页面到指定目录
gulp.task('html', function () {
  gulp.src(src + '*.html')
    .pipe(htmlmin({collapseWhitespace: true}))
    .pipe(gulp.dest(dest));
});

gulp.task('css', function () {
  gulp.src(src + 'index.less')
    .pipe(less().on('error', function (e) {
      console.error(e.message);
      this.emit('end');
    }))
    .pipe(autoprefixer())
    //.pipe(header(banner, { pkg: pkg }))
    .pipe(gulp.dest(dest))
    .pipe(mincss())
    .pipe(rename({ suffix: '.min' }))
    .pipe(gulp.dest(dest));
});

gulp.task('md', function () {
  return gulp.src(src + '*.md')
    .pipe(markdown())
    // 统一转换到 doc 目录
    .pipe(gulp.dest(dest))
});

// js 异步打包，webpack的 watch 功能，会自动监视目标文件，有文件修改会自动重新打包
gulp.task('js', function() {
  var wpcfg = options.env === 'production' ? wpProdCfg : wpDevCfg;
  webpack(_.merge(wpcfg, { // 替换 webpack.config.js 里的设置
    entry: {index: src + 'index.js'},
    output: {path: path.resolve(__dirname, dest)},
    watch: true // 监控js 文件变化，变化后自动再次触发 该任务，以增量方式生成，速度更快
  })).watch(200, function(err, stats) {
    packLog(err, stats);
    // callback(); //异步任务的关键之处，如果没有这行，任务会一直阻塞
  });
});

// 本地web服务，用于本地调试
// gulp.task('web', function () {
  // connect.server({
    // name: 'web',
    // root: 'dist', // web服务根目录
    // port: 3003, // 端口
    // livereload: true
  // });
// });

// 监控文件变化，变化了则自动刷新本地浏览器
gulp.task('reload', function () {
  watch(['dist/**/*.html', 'dist/**/ *.css', 'dist/**/*.js'])
    .pipe(connect.reload());
});

// 监视html文件任务，文件被修改，自动触发该任务
// js 文件由 webpack自己的监控编译，更快
gulp.task('watch', ['html', 'css', 'md'], function() {
  gulp.watch('src/**/*.html', ['html']);
  gulp.watch('src/**/*.less', ['css']);
  gulp.watch('md/**/*.md', ['md']);
});

// 缺省任务，gulp 任务名称，不带任务名称时，执行该任务
gulp.task('default', ['watch', 'js', 'reload']);
